package com.sxj.corejava.code13_jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 石小俊
 */
public class Test01_快速入门 {

    public static void main(String[] args) {
//        User user = new User("admin", "123456", "13812345678", "江苏-南京");
//        addUser(user);
//        User user = new User("lucy", "222222", "13912345689", "江苏-常州");
//        addUser(user);

//        List<User> users = selectAll();
//        for (User user : users) {
//            System.out.println(user);
//        }

//        User user = new User("john", "333333", "13912345689", "江苏-无锡");
//        user.setId(2);
//        updateUser(user);

//        deleteById(4);

        User user = selectById(1);
        System.out.println(user);
    }

    public static void addUser(User user) {
        // 通过JDBC访问数据库,主要分为六步
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            // 注册数据库厂商提供的驱动
            // 根据不同的数据库厂商注册的驱动也不同
            // 数据库类型可能不同、版本不同、包不同、类也可能不相同
            // 根据Class.forName()方法注册对应驱动,其参数为驱动类的包名.类名
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2.获取连接,通过访问数据库厂商提供的url地址以及数据库的账号密码进行连接
            // 不同数据库厂商提供的url地址也不同
            // public static Connection getConnection(String url,String user, String password)
            // url:数据库厂商提供的URL地址
            // user:数据库的账号
            // password:数据库的密码
            // MySQL的url地址格式为{jdbc:mysql://ip地址:端口号/库名}
            // ip地址为当前MySQL服务所在的服务器的ip地址
            // 如果是本机,可以使用本地地址:127.0.0.1或者localhost
            // MySQL默认端口是3306
            // conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc", "root", "root");
            // 在Java访问数据库的时候,可能会存在乱码,为了防止乱码,可以在url地址的末尾添加指定编码
            // ?useUnicode=true&characterEncoding=utf-8
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");

            // 3.获取状态集,用于操作数据库
            st = conn.createStatement();

            // 4.执行sql
            // 准备一个sql语句
            String sql = "insert into t_user(username,password,phone,address) values('" + user.getUsername() + "','" + user.getPassword() + "','" + user.getPhone() + "','" + user.getAddress() + "')";
            // 执行DML操作,即:inset、delete、update
            // 方法返回值表示受到影响的行数
            int rows = st.executeUpdate(sql);
            System.out.println("Query OK, " + rows + " row affected (0.01 sec)");

            // 第五步:行映射,将数据库查询结果映射成Java对象的数据
            // 对于DML操作,没有第五步
            // 对于查询操作,存在第五步
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    public static List<User> selectAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        // 准备一个对象集合,用于接收结果集中映射的数据
        List<User> users = new ArrayList<>();
        try {
            // 1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            // 3.获取状态集
            st = conn.createStatement();
            // 4.执行sql
            String sql = "select id,username,password,phone,address from t_user";
            // 执行查询操作,查询操作存在返回值,返回值是数据库查询结果的结果集
            rs = st.executeQuery(sql);

            // 5.行映射
            // 将数据库查询结果转换成Java对象
            // 每一行数据映射成一个Java对象
            // 如果存在多行数据,则一行一行的读取,每读取一行,映射一个Java对象
            // 通过方法next()判断是否存在下一行数据
            while (rs.next()) {
                // next()用于进入数据行,每执行一次进入一行
                // 第一次执行读取第一行数据,第二次执行则读取第二行数据,以此类推
                // 每一行数据都需要映射成一个Java对象
                User user = new User();
                // 第一列的值映射到Java对象的id属性值中
                // 通过getXxx(index)获取第index列的xxx类型的数据
                int id = rs.getInt(1);
                // 如果结果集的数据比较多的话,通过列数可能存在混乱的场景
                // 在实际开发中,不建议通过第几列获取数据,可以通过指定列名来获取
                // getXxx(列名)可以获取指定列的数据
                int id2 = rs.getInt("id");
                System.out.println("id:" + id + ",id2:" + id2);
                user.setId(id);
                // 简写方式
                // user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                // 当这一行数据都映射成指定的Java对象的属性值之后
                // 将该对象添加到集合中
                users.add(user);
            }

        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return users;
    }

    public static void updateUser(User user) {
        Connection conn = null;
        Statement st = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            st = conn.createStatement();
            String sql = "update t_user set username = '" + user.getUsername() + "',password = '" + user.getPassword() + "',phone='" + user.getPhone() + "',address='" + user.getAddress() + "' where id = " + user.getId();
            st.executeUpdate(sql);
            System.out.println("提示:恭喜您,修改成功");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static void deleteById(Integer id) {
        Connection conn = null;
        Statement st = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            st = conn.createStatement();
            String sql = "delete from t_user where id = " + id;
            st.executeUpdate(sql);
            System.out.println("提示:恭喜您,删除成功");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static User selectById(Integer id) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        User user = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            st = conn.createStatement();
            String sql = "select * from t_user where id = " + id;
            rs = st.executeQuery(sql);
            while (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return user;
    }

}
